#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>
#include<fstream>
#include<sstream>

using namespace std;

//��������Ǻ���������������༰�����

//int main()
//{
//	cout << "hello" << endl;
//	cerr << "hello" << endl;
//	clog << "hello" << endl;
//
//	return 0;
//}

//int main()
//{
//	string str;
//    //������һ��cin��cin��bool�������أ������ڲ��ж���û�е��ļ�β��
//	while (cin >> str) //operator>>(cin, str)
//	{
//		cout << str << endl;
//	}
//
//	//C���Եȼ�д�����£����������ã�
//	char buff[128];
//	while (~scanf("%s", buff))
//	{
//		printf("%s\n", buff);
//	}
//
//	//���߹�����ͬ�������İ취��ctrl + z Ȼ�� + ����
//	//��ʱ������Ϊ�����˽�β��һ��Լ��
//	//ctrl + c �൱���Ǹ����̷���һ���źţ�ǿ�ƽ����̸�ɱ����
//	//���Ƽ���
//	return 0;
//}

//������
//�Զ���������ʽ����ת��
class Date
{
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}

	//֧��Date����ת����bool
	//�����������������ô�����������أ�
	//����֧�ֵľ��ǽ��Զ�������ת������������
	operator bool()
	{
		//����������д�ģ���������_yearΪ0�������
		if (_year < 1)
			return false;
		else
			return true;
	}

	//ת��������
	operator int()
	{
		return _year + _month + _day;
	}

	//����()�����������������������õĲ����б���Ҳ�����ǿ������ȼ��ģ�Ҳ������ǿ������ת��
	//�º����Ѿ�����operator()�ˣ���ôǿ������ת���Ͳ�����operator()ת����

private:
	int _year;
	int _month;
	int _day;
};

//������������Ļ�����istream�Ϳ���֧��while��if��Щ�ж���
istream& operator >> (istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}

ostream& operator << (ostream& out, const Date& d)
{
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

//int main()
//{
//	Date d1 = -1;
//	Date d2 = { 2023, 3, 23 };
//
//	//�Զ�������ת������������
//	bool ret1 = d1;
//	bool ret2 = d2;
//
//	//������ת
//	int i1 = d1;
//	int i2 = d2;
//
//	cout << ret1 << endl;
//	cout << ret2 << endl;
//
//	//֧��ת��bool�������ǵ��������غ���
//	if (d1)
//	{
//
//	}
//
//	return 0;
//}
//
//int main()
//{
//	//�Ƕ��ļ�
//	//in�Ƕ�ȡ��out����д�ļ�
//	ifstream ifs("text.cpp");
//
//	//������operator bool
//	//������ȡ����true����ȡʧ�ܻ��߶����ļ���β�˾ͷ���false
//	//while (ifs)
//	//{
//	//	//һ���ַ�һ���ַ��Ķ���������֮���ӡ
//	//	char ch = ifs.get();
//	//	cout << ch;
//	//}
//
//	//�Զ��ѿո���Ե���
//	char ch;
//	while (ifs >> ch)
//	{
//		cout << ch;
//	}
//
//	return 0;
//}

//int main()
//{
//	ifstream ifs("text.cpp");
//	ofstream ofs("Copy.cpp");
//
//	char ch;
//	ch = ifs.get();
//	//while (ifs)
//	while (~ch)
//	{
//		//���뵽�ļ�����ȥ
//		ofs << ch;
//		cout << ch;
//
//		ch = ifs.get();
//	}
//
//	return 0;
//}
//
////����������ṹ��д���ļ���
//struct ServerInfo
//{
//	char _address[256];
//	//string _address;
//	int _port;
//
//	Date _d;
//};
//
//struct ConfigManager
//{
//public:
//	ConfigManager(const char* filename)
//		:_filename(filename)
//	{}
//
//	void WriteBin(const ServerInfo& info)
//	{
//		//1 2 4 8 16
//		ofstream ofs(_filename, ios_base::out | ios_base::binary);
//		ofs.write((const char*)&info, sizeof(info));
//	}
//
//	void ReadBin(ServerInfo& info)
//	{
//		ifstream ifs(_filename, ios_base::in | ios_base::binary);
//		ifs.read((char*)&info, sizeof(info));
//	}
//
//	//�ı���д
//	void WriteText(const ServerInfo& info)
//	{
//		//1 2 4 8 16
//		ofstream ofs(_filename);
//		ofs << info._address << endl;
//		ofs << info._port << endl;
//		ofs << info._d << endl;
//	}
//
//	void ReadText(ServerInfo& info)
//	{
//		ifstream ifs(_filename);
//		ifs >> info._address;
//		ifs >> info._port;
//		ifs >> info._d;
//	}
//
//private:
//	string _filename; //�����ļ�
//};
//
//int main()
//{
//	//�����ַ�ʽд���ļ����ֱ��Ƕ����Ʒ�ʽ���ı���ʽ
//	ServerInfo winfo = { "https://legacy.cplusplus.com/reference/ios/ios/eof/", 80, {2023, 3, 24} };
//
//	//�����ƶ�д��ȥ
//	ConfigManager cf_bin("test.bin");
//	cf_bin.WriteBin(winfo);
//
//	ConfigManager cf_bin("test.bin");
//	ServerInfo rbinfo;
//	cf_bin.ReadBin(rbinfo);
//	cout << rbinfo._address << "  " << rbinfo._port << "  " << rbinfo._d;
//
//	/*ConfigManager cf_txt("test.txt");
//	cf_txt.WriteText(winfo);*/
//
//
//	/*ConfigManager cf_text("test.txt");
//	ServerInfo rtinfo;
//	cf_text.ReadText(rtinfo);
//	cout << rtinfo._address << "  " << rtinfo._port << "  " << rtinfo._d << endl;*/
//
//	return 0;
//}

//��������ֱ�ӵ��ÿ�����������������ȡ���Զ������͵��ǵ��������Լ�ʵ�ֵ�

//���л���ת���ַ������ͷ����л���ת��������
//stringstream ����ת���Զ������ͻ���������
//���Ժܷ���Ľ�����ת�ַ������ַ���ת����

int main()
{
	//������ת���ַ������൱�ڽ����β����ȥ��ת���ַ�����
	int i = 123;
	double d = 44.55;
	ostringstream oss;
	oss << i;

	cout << oss.str() << endl;
	string stri = oss.str();

	//��ֵ����һ��
	oss.str("");
	oss << d;
	string strd = oss.str();

	oss.str("");
	Date d1(2022, 10, 11);
	oss << d1;
	string strdt = oss.str();

	cout << strdt << endl;

	istringstream iss(strdt);
	Date d2;
	iss >> d2;


	return 0;
}

//istream �� ostream �ײ㱾������������ת����ת�ɳ��ַ���������
//Ȼ��洢���ַ�����ȥ��ͬ

struct ChatInfo
{
	string _name; //����
	int _id;      //id
	Date _date;   //ʱ��
	string _msg;  //������Ϣ
};

int main()
{
	//�ṹ��Ϣ���л�Ϊ�ַ���
	ChatInfo winfo = { "����", 135246, { 2022, 4, 10 }, "����һ�𿴵�Ӱ��" };
	ostringstream oss;
	oss << winfo._name << " " << winfo._id << " " << winfo._date << " " << winfo._msg;
	string str = oss.str();
	cout << str << endl << endl;

	//����ͨ����������ַ������͸�����ʵ�ʿ����У���Ϣ��Ը����ӣ�
	//һ���ѡ��Json��xml�ȷ�ʽ���и��õ�֧��
	//�ַ��������ɽṹ��Ϣ
	ChatInfo rInfo;
	istringstream iss(str);
	iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;
	cout << "-------------------------------------------------------" << endl;
	cout << "������" << rInfo._name << "(" << rInfo._id << ") ";
	cout << rInfo._date << endl;
	cout << rInfo._name << ":>" << rInfo._msg << endl;
	cout << "-------------------------------------------------------" << endl;

	return 0;
}
